# -*- coding: utf-8 -*-
import json
from openai import OpenAI
from tqdm import tqdm 
#from transformers import AutoTokenizer

import re
import httpx

# 评价民事、行政的结果
# 分为准确率（生成内容正确的比例）和召回率（生成内容匹配的比例）
    
def GPT_4(system_massage, prompt):
    client = OpenAI(
        base_url="https://oneapi.xty.app/v1", 
        api_key="xxx",
        http_client=httpx.Client(
            base_url="https://oneapi.xty.app/v1",
            follow_redirects=True,
        ),
    )

    completion = client.chat.completions.create(
        #model="gpt-3.5-turbo-1106",
        model="gpt-4-1106-preview",
        messages=[
            {"role": "system", "content": '你是一个专业的法律助手'},
            {"role": "user", "content": prompt}
        ]
    )

    return completion.choices[0].message.content.strip()
    
data_path = 'SimuCourt1.18(2).json'
with open(data_path, 'r', encoding='utf-8') as file:
    data = json.load(file)

# 数据集的gold result
gold_judge_path = 'judge_result.json'
with open(gold_judge_path, 'r', encoding='utf-8') as file:
    gold_judge = json.load(file)

model_judge_path = 'record_eval.json'
with open(model_judge_path, 'r', encoding='utf-8') as file:
    model_judge = json.load(file)


judge_other_result = {}
judge_other_result_score = {}

error_list = []
gold_keys = 0
pred_results = 0
pred_keys = 0
pred_right = 0

for number, gold_result in tqdm(gold_judge.items()):
        if gold_result["案件类型"] == '民事案件' or gold_result["案件类型"] == '行政案件':
            
            pred_result = model_judge[number]

            CASE_TEMPLATE1 = """
            我希望你帮助我对比和评估两组文本——一组“标准答案”和一组“生成答案”。你需要根据以下标准来计算生成答案的“内容匹配度”和“内容准确性”，“标准答案”和 “生成答案”分别包含多个结果。 

            内容匹配度：这是针对生成答案中的每个关键点来评估的。请检查生成答案中有多少关键信息点与标准答案中的关键信息点相匹配。对于生成答案中的每一个匹配的关键信息点，给予1分，请进行严格判断，得分只有0或者1。例如，如果标准答案包含4个关键点，生成答案匹配了其中2个，则内容匹配度得分为2分。 

            内容准确性：这是针对生成答案中的每个单独结果来评估的。对于生成答案中的每个结果，如果它完全准确地匹配了至少一个关键点，并且不包含任何错误或不相关的信息，那么这个结果被视为准确，得1分，请进行严格判断，得分只有0或者1。例如，如果生成答案中有两条结果中都仅包含正确的信息，那么准确性得分为2分。 请您在评估时，不仅要考虑文本的字面相似度，还要考虑信息点的匹配程度。我将提供具体的文本示例，你基于这些示例进行评估。 

            在任何时候你的输出只能包含以下内容： 
            内容匹配度评估：<你的内容匹配度评估内容> 
            内容准确性评估：<你的内容准确性评估内容> 
            输出结果：<你的结果> 

            示例1： 
            标准答案：{ "结果1": "被告浙江**得方商贸有限公司于本判决生效之日起五日内退还原告马志豪租赁保证金6000元、剩余租金17025元", "结果2": "被告浙江**得方商贸有限公司于本判决生效之日起五日内支付原告马志豪违约金5950元", "结果3": "驳回原告马志豪的其他诉讼请求" } 
            生成答案：{ "结果1": "被告向原告退还押金6000元", "结果2": "被告向原告退还剩余租金17025元" } 
            内容匹配度评估：标准答案有4个关键点：退还租赁保证金6000元、退还剩余租金17025元、支付违约金5950元、驳回其他诉讼请求。生成答案中，“结果1”匹配了第一个关键点（退还租赁保证金6000元），“结果2”匹配了第二个关键点（退还剩余租金17025元）。因此，内容匹配度的得分为2分。 
            内容准确性评估：生成答案有2个结果。生成答案的“结果1”完全准确地匹配了一个关键点，没有包含不正确的信息，因此得1分。生成答案的“结果2”也完全准确地匹配了一个关键点，同样没有不正确的信息，因此也得1分。因此，准确性的得分为2分。 
            输出结果：{"标准答案关键点":4, "内容匹配度":2, "生成答案结果数":2, "内容准确性":2} 

            示例2： 
            标准答案：{"结果1": "撤销被告青海省自然资源厅2022年7月26日作出的《采矿权申请事项退件通知》", "结果2": "被告青海省自然资源厅于本判决生效后四十日内对原告化隆县九方矿业有限公司申请化隆县关藏镍矿采矿权延续登记申请重新作出行政行为" } 
            生成答案：{ "结果1": "驳回原告化隆县九方矿业有限公司的诉讼请求"} 
            内容匹配度评估：标准答案有2个关键点：撤销被告青海省自然资源厅2022年7月26日作出的《采矿权申请事项退件通知》、被告青海省自然资源厅于本判决生效后四十日内对原告化隆县九方矿业有限公司申请化隆县关藏镍矿采矿权延续登记申请重新作出行政行为。 生成答案中的关键点为：驳回原告化隆县九方矿业有限公司的诉讼请求。生成答案中的关键点与标准答案中的任何一个关键点均不匹配。因此，内容匹配度得分为0分。 
            内容准确性评估：生成答案只有1个结果，且这个结果与标准答案中的任何一个关键点都不匹配，因此这个结果不被视为准确。因此，内容准确性得分也为0分。 
            输出结果：{"标准答案关键点":2, "内容匹配度":0, "生成答案结果数":1, "内容准确性":0} 

            示例3：
            标准答案：{"结果1": "被告余登合在本判决生效后十日内支付原告刘定江货款10650元及以10650元为基数从2015年12月21日起至付清时止按中国人民银行同期同类存款利率四倍计算的利息", "结果2": "驳回原告刘定江的其他诉讼请求" } 
            生成答案：{ "结果1": "被告余登合应在判决生效之日起三日内支付原告刘定江运费10650元及利息" }
            内容匹配度评估：标准答案有两个关键点：1) 被告余登合支付原告刘定江货款10650元及相应利息，2) 驳回原告刘定江的其他诉讼请求。生成答案中，“结果1”部分匹配了第一个关键点，提到支付10650元及利息，但没有提及是货款而是错误地提到了运费，也未提到按中国人民银行同期同类存款利率四倍计算的利息细节。第二个关键点在生成答案中没有被提及。因此，内容匹配度得分为0分。
            内容准确性评估：生成答案只有1个结果。这个结果虽然提到了支付10650元及利息，但却错误地将其描述为运费而不是货款，并且没有提及利息的具体计算方式。因此，这个结果不完全准确地匹配了标准答案的关键点。因此，内容准确性得分为0分。
            输出结果：{"标准答案关键点":2, "内容匹配度":0, "生成答案结果数":1, "内容准确性":0}

            示例4：
            标准答案：{"结果1": "被告于本判决生效之日起十日内支付杭州萧山商业城谷正副食品批发部价款21595元，并赔偿该款自2018年6月1日起按年利率5％计算至实际履行之日止的利息损失"}
            生成答案：{"结果1": "被告杜复海支付货款21595元","结果2": "被告支付自2018年6月1日起至付清之日止的年利率5％的利息损失"}
            内容匹配度评估：标准答案包含了两个关键信息点：1) 被告支付价款21595元；2) 赔偿款项自2018年6月1日起按年利率5%的利息损失直至实际履行之日止。生成答案中，“结果1”匹配了第一个关键信息点，“结果2”中“实际履行之日止”与“付清之日止”语义一致，匹配了第二个关键信息点。因此，内容匹配度得分为2分。
            内容准确性评估：生成答案有两个结果，其中“结果1”原文中没有提到“杭州萧山商业城谷正副食品批发部”的名称，但根据上下文，这部分似乎是被省略的附加信息，不影响关键信息的准确匹配，因此“结果1”得1分。虽然“结果2”并未包含标准答案中的“直至实际履行之日止”，但“实际履行之日止”与“付清之日止”语义一致，因此“结果2”得1分。因此，内容准确性得分为2分。
            输出结果：{"标准答案关键点":2, "内容匹配度":2, "生成答案结果数":2, "内容准确性":2}

            当前标准答案和生成答案：
            标准答案：<gold_result>
            生成答案：<model_result>
            """

            CASE_TEMPLATE2 = """
            我希望你帮助我对比和评估两组文本——一组“标准答案”和一组“生成答案”。你需要根据以下标准来计算生成答案的“内容匹配度”和“内容准确性”，“标准答案”和 “生成答案”分别包含多个结果。 

            内容匹配度：这是针对生成答案中的每个关键点来评估的。请检查生成答案中有多少关键信息点与标准答案中的关键信息点相匹配。对于生成答案中的每一个匹配的关键信息点，给予1分，请进行严格判断，得分只有0或者1。例如，如果标准答案包含4个关键点，生成答案匹配了其中2个，则内容匹配度得分为2分。 

            内容准确性：这是针对生成答案中的每个单独结果来评估的。对于生成答案中的每个结果，如果它完全准确地匹配了至少一个关键点，并且不包含任何错误或不相关的信息，那么这个结果被视为准确，得1分，请进行严格判断，得分只有0或者1。例如，如果生成答案中有两条结果中都仅包含正确的信息，那么准确性得分为2分。 请您在评估时，不仅要考虑文本的字面相似度，还要考虑信息点的匹配程度。我将提供具体的文本示例，你基于这些示例进行评估。 

            在任何时候你的输出只能包含以下内容： 
            内容匹配度评估：<你的内容匹配度评估内容> 
            内容准确性评估：<你的内容准确性评估内容> 
            输出结果：<你的结果> 

            示例1： 
            标准答案：{ "结果1": "被告浙江**得方商贸有限公司于本判决生效之日起五日内退还原告马志豪租赁保证金6000元、剩余租金17025元", "结果2": "被告浙江**得方商贸有限公司于本判决生效之日起五日内支付原告马志豪违约金5950元", "结果3": "驳回原告马志豪的其他诉讼请求" } 
            生成答案：{ "结果1": "被告向原告退还押金6000元", "结果2": "被告向原告退还剩余租金17025元" } 
            内容匹配度评估：标准答案有4个关键点：退还租赁保证金6000元、退还剩余租金17025元、支付违约金5950元、驳回其他诉讼请求。生成答案中，“结果1”匹配了第一个关键点（退还租赁保证金6000元），“结果2”匹配了第二个关键点（退还剩余租金17025元）。因此，内容匹配度的得分为2分。 
            内容准确性评估：生成答案有2个结果。生成答案的“结果1”完全准确地匹配了一个关键点，没有包含不正确的信息，因此得1分。生成答案的“结果2”也完全准确地匹配了一个关键点，同样没有不正确的信息，因此也得1分。因此，准确性的得分为2分。 
            输出结果：{"标准答案关键点":4, "内容匹配度":2, "生成答案结果数":2, "内容准确性":2} 

            示例2： 
            标准答案：{"结果1": "撤销被告青海省自然资源厅2022年7月26日作出的《采矿权申请事项退件通知》", "结果2": "被告青海省自然资源厅于本判决生效后四十日内对原告化隆县九方矿业有限公司申请化隆县关藏镍矿采矿权延续登记申请重新作出行政行为" } 
            生成答案：{ "结果1": "驳回原告化隆县九方矿业有限公司的诉讼请求"} 
            内容匹配度评估：标准答案有2个关键点：撤销被告青海省自然资源厅2022年7月26日作出的《采矿权申请事项退件通知》、被告青海省自然资源厅于本判决生效后四十日内对原告化隆县九方矿业有限公司申请化隆县关藏镍矿采矿权延续登记申请重新作出行政行为。 生成答案中的关键点为：驳回原告化隆县九方矿业有限公司的诉讼请求。生成答案中的关键点与标准答案中的任何一个关键点均不匹配。因此，内容匹配度得分为0分。 
            内容准确性评估：生成答案只有1个结果，且这个结果与标准答案中的任何一个关键点都不匹配，因此这个结果不被视为准确。因此，内容准确性得分也为0分。 
            输出结果：{"标准答案关键点":2, "内容匹配度":0, "生成答案结果数":1, "内容准确性":0} 

            示例3：
            标准答案：{"结果1": "被告余登合在本判决生效后十日内支付原告刘定江货款10650元及以10650元为基数从2015年12月21日起至付清时止按中国人民银行同期同类存款利率四倍计算的利息", "结果2": "驳回原告刘定江的其他诉讼请求" } 
            生成答案：{ "结果1": "被告余登合应在判决生效之日起三日内支付原告刘定江运费10650元及利息" }
            内容匹配度评估：标准答案有两个关键点：1) 被告余登合支付原告刘定江货款10650元及相应利息，2) 驳回原告刘定江的其他诉讼请求。生成答案中，“结果1”部分匹配了第一个关键点，提到支付10650元及利息，但没有提及是货款而是错误地提到了运费，也未提到按中国人民银行同期同类存款利率四倍计算的利息细节。第二个关键点在生成答案中没有被提及。因此，内容匹配度得分为0分。
            内容准确性评估：生成答案只有1个结果。这个结果虽然提到了支付10650元及利息，但却错误地将其描述为运费而不是货款，并且没有提及利息的具体计算方式。因此，这个结果不完全准确地匹配了标准答案的关键点。因此，内容准确性得分为0分。
            输出结果：{"标准答案关键点":2, "内容匹配度":0, "生成答案结果数":1, "内容准确性":0}

            示例4：
            标准答案：{"结果1": "被告于本判决生效之日起十日内支付杭州萧山商业城谷正副食品批发部价款21595元，并赔偿该款自2018年6月1日起按年利率5％计算至实际履行之日止的利息损失"}
            生成答案：{"结果1": "被告杜复海支付货款21595元","结果2": "被告支付自2018年6月1日起至付清之日止的年利率5％的利息损失"}
            内容匹配度评估：标准答案包含了两个关键信息点：1) 被告支付价款21595元；2) 赔偿款项自2018年6月1日起按年利率5%的利息损失直至实际履行之日止。生成答案中，“结果1”匹配了第一个关键信息点，“结果2”中“实际履行之日止”与“付清之日止”语义一致，匹配了第二个关键信息点。因此，内容匹配度得分为2分。
            内容准确性评估：生成答案有两个结果，其中“结果1”原文中没有提到“杭州萧山商业城谷正副食品批发部”的名称，但根据上下文，这部分似乎是被省略的附加信息，不影响关键信息的准确匹配，因此“结果1”得1分。虽然“结果2”并未包含标准答案中的“直至实际履行之日止”，但“实际履行之日止”与“付清之日止”语义一致，因此“结果2”得1分。因此，内容准确性得分为2分。
            输出结果：{"标准答案关键点":2, "内容匹配度":2, "生成答案结果数":2, "内容准确性":2}

            当前标准答案和生成答案：
            原审结果：<first_result>
            标准答案：<gold_result>
            生成答案：<model_result>
            """
            
            gold_result_dict = {}

            if "结果1" in gold_result:
                gold_result_dict["结果1"] = gold_result["结果1"]
            if "结果2" in gold_result:
                gold_result_dict["结果2"] = gold_result["结果2"]
            if "结果3" in gold_result:
                gold_result_dict["结果3"] = gold_result["结果3"]
            for case in data:
                if case["案号"] == number:
                    current_case = case
            first_result = current_case["一审法院审判结果"]
            # 基本案情
            task_prompt = CASE_TEMPLATE2.replace('<gold_result>', str(gold_result_dict))
            task_prompt = task_prompt.replace('<model_result>', str(pred_result["判决结果"]))
            task_prompt = task_prompt.replace('<first_result>', first_result)
            #print(task_prompt)
            try:
                judge_analysis = GPT_4('judge_final_system', task_prompt)
                try:
                    json_str = re.search(r'输出结果：(.+)', judge_analysis).group(1)
                    result_dict = json.loads(json_str)
                    judge_other_result_score[number] = result_dict
                    #print(result_dict)
                    gold_keys += result_dict["标准答案关键点"]
                    pred_results += result_dict["生成答案结果数"]
                    pred_keys += result_dict["内容匹配度"]
                    pred_right += result_dict["内容准确性"]
                    judge_other_result[number] = judge_analysis
                except:
                    print('Extract error', number)
                    error_list.append(number) 
            except:
                print('Error:', number)
                error_list.append(number)

print(error_list)
try:
    p = pred_right/pred_results
    r = pred_keys/gold_keys
    f = 2*p*r/(p+r)
except:
    p, r, f = 0, 0, 0
    
print('P:', p)
print('R:', r)
print('F1:', f)





    